import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
// 引入 Pinia 的 authStore
import { useAuthStore } from '@/stores/authStore'
// 引入页面组件
import HomePage from '@/views/HomePage.vue'
import ForgotPwdPage from '@/views/ForgotPwdPage.vue'
import RegisterPage from '@/views/RegisterPage.vue'
import LoginPage from '@/views/LoginPage.vue'

// 引入Gitee回调页面
import GiteeCallbackPage from '@/views/GiteeCallbackPage.vue'

// 定义路由规则
const routes = [
  {
    path: '/',
    redirect: '/login' // 重定向到登录页面
  },
  {
    path: '/home',
    name: 'Home', // 路由名称（唯一，用于编程式导航）
    component: HomePage,
    //在meta当中可以定义一些要使用的数据
    meta: {
      requiresAuth: true // 标记：该路由需要登录才能访问
    }
  },
  {
    path: '/forgot-password',
    name: 'ForgotPwd',
    component: ForgotPwdPage,
    meta: {
      requiresAuth: false // 标记：该路由无需登录即可访问注意这个标记是有用的
      // 如果这个标记为false也就不需要判断我是否登录就可以进入该页面
    }
  },
  {
    path: '/register',
    name: 'Register',
    component: RegisterPage,
    meta: {
      requiresAuth: false // 标记：该路由无需登录即可访问
    }
  },
  {
    path: '/login',
    name: 'Login',
    component: LoginPage,
    meta: {
      requiresAuth: false // 无需登录即可访问
    }
  },
  // 添加Gitee回调路由
  {
    path: '/gitee/callback',
    name: 'GiteeCallback',
    component: GiteeCallbackPage,
    meta: {
      requiresAuth: false
    }
  }
]

// 2. 创建路由实例（使用 HTML5 History 模式，URL 无 # 号）
const router = createRouter({
  //这是 Vite 构建工具提供的环境变量，对应项目配置中的 base 选项（通常在 vite.config.js 中设置，默认值为 '/'）。
  //这里表示使用的路由模式为HTML5 History 模式，同时配置了基于环境变量的基础路径，在我这里面为/zsyk
  history: createWebHistory(import.meta.env.BASE_URL), 
  routes // 注入上述路由规则
})

// 3. 路由前置守卫（每次路由切换前触发，核心逻辑）
router.beforeEach((to, from, next) => {
  // 从 Pinia 中获取 authStore 实例
  const authStore = useAuthStore()
  
  // 核心判断逻辑：、
  //1. 如果我访问的页面需要登录但是我没有登录的情况就跳转到登录页面
  //2. 如果我已经登录了但是尝试访问登录/注册/忘记密码页，就重定向到首页
  //3. 其他情况（无需登录的页面 / 已登录访问需授权页面）：正常跳转
  // - 若目标路由需要登录（requiresAuth: true），且用户未登录（isLoggedIn 为 false）
  if (to.meta.requiresAuth && !authStore.isLoggedIn) {
    // 跳转到登录页，并携带当前路径指的是不包括http://localhost:8081/zsyk（方便登录后返回原页面）
    next({ name: 'Login', query: { redirect: to.path } })
  } else if(authStore.isLoggedIn && (to.name as string) in ['Login', 'Register', 'ForgotPassword']) { 
    //这里也可以将['Login', 'Register', 'ForgotPassword']定义为数组然后使用数组的includes方法
    // 对于已经登录的用户并且尝试访问登录/注册/忘记密码页，
    // 重定向到首页（避免已登录用户访问这些页面）
    next({ name: 'Home' })
  }
  // - 其他情况（无需登录的页面 / 已登录访问需授权页面）：正常跳转
  else {
    next()
  }
})

export default router